約 4,334,073 件
https://w.atwiki.jp/java_pro/pages/22.html
import java.io.*; public class Otoshidama3{ public static void main(String[] args){ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); int top = 0;/* 最も高い金額を入れる変数 */ try { for (int i = 0; i 3; i++){ System.out.println((i + 1) + "回目の金額を入力して下さい。"); String line = reader.readLine(); /* お年玉の金額を入力 */ int n = Integer.parseInt(line); if (top n){ top = n;/* より高い金額なら入れ替える */ } } System.out.println("最高金額は" + top + "円です。"); } catch (IOException e){ System.out.println(e); } } }
https://w.atwiki.jp/java_pro/pages/21.html
import java.io.*; public class Break { public static void main(String[] args){ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { while (true){//無限ループ String line = reader.readLine();//標準入力から一行取得 if (line == null){//nullなら繰返しを抜ける break; } System.out.println(line);//画面に取得した文字列を表示 } System.out.println("終了します。"); } catch (IOException e){ System.out.println(e); } } }
https://w.atwiki.jp/sfrontier/pages/30.html
Knowledge and Technique 作成日 2007/11/01 H.Naito 更新日 2007/11/27 T.Kodama 注意 このページは基本的に、Java 5.0 での情報を載せています。 Java 5.0 以外のバージョンの情報を掲載する場合には、バージョン情報を付けた上で記述します。 General 文法 フレームワーク Information その他 メモ General Java ってなあに? Wikipedia IT用語辞典 e-Words はてなダイアリー 文法 予約語 識別子 データ型 演算子 フレームワーク Information WebPage Books Effective Java SampleCode その他 javacコマンド メモ 配列 宣言の際、変数に [] を付けないで、型に付ける方が Java っぽい ant の話 Javac でソースディレクトリを指定しているのに、 sourcepath="" を入れるのは、コンパイルの際、include を消しても勝手に javac が階層配下を見に行って成功させてしまい、実際に動かそうとしたらクラスが無いとなっていしまうのを防ぐ為。 ソースファイル内での定義の順番 [ Option ] パッケージ宣言 [ Option ] インポート宣言 [ 必須 ] クラス、インタフェース、列挙型の定義 パブリッククラスとクラス名 ソースファイル内に1つでも public クラスがある場合には、そのソースファイル名は必ずパブリッククラスと同じ名前を付けなければいけません。 したがって、パブリッククラスは1つのソースファイル内に1つしか定義できません。 同様に、public 指定されたインタフェースや列挙型がある場合は、ソースファイル名は、必ず public 指定されたインタフェースや列挙型と同じでなければ、なりません。
https://w.atwiki.jp/java_pro/pages/38.html
public class MethodTest { public static ??? getYourName(String myouji, String name){ String[] result; result = ?????; ???? = myouji; ???? = name; return ????; } public static void main(String[] args){ String[] shimei; ???? = getYourName("java", "太郎"); System.out.println("名字は" + ????); System.out.println("名前は" + ????); } }
https://w.atwiki.jp/java_pro/pages/34.html
import java.io.*; public class CountSan { public static void main(String[] args){ for (int i = 3; i = 99; i = i + 3){ System.out.println(i); } } }
https://w.atwiki.jp/java_pro/pages/28.html
import java.io.*; public class Copy1_3 { public static void main(String[] args){ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { String line = reader.readLine(); int n = Integer.parseInt(line); while (n != 0){ System.out.println(n * 10); line = reader.readLine(); n = Integer.parseInt(line); } System.out.println("終了します"); } catch (IOException e){ System.out.println(e); } } }
https://w.atwiki.jp/yo-kichi/pages/89.html
プログラム言語とは Javaが実行環境に依存しない理由 ソフトウェアを作るのがプログラミング言語です。 これには、C、C++、C#言語やJava言語があります。 Q.プログラミング言語とはどんなものでしょう?--プログラミング言語の必要性は?-- プログラミング言語は、コンピュータにさせる処理を人間にとってわかりやすく記述できる言語です。 なぜ人間にわかりやすく記述できるプログラミング言語が必要かというと、CPUはすべて機械語で動いていて、その機械語は0,1の羅列で 記述されていて、普通の人間がその意味を理解したりするのは難しいし、できたとしても非効率的です。 また、機械語はCPUごとに違いがあるため、CPUごとの扱える必要があります。 では、どうやってプログラミング言語でコンピュータに命令を与えているのかというと、それはコンパイルという行為を行うことによってプログラミング言語 で記述されたファイル(ソースコード)を機械語に翻訳することができるからです。 で、コンパイルすると書きましたが、これはコンパイラというソフトウェアによっておこなわれます。 どういうことか実際に図をかいてみてみましょう ここでは例としてC言語を取り扱います。 [ここでC言語の図を書く] C言語は、OSがwindowsの場合は、コンパイルすることによってexeファイルが生成されます。これは、機械語で記述実行形式のファイルです。 これを実行すると、コンピュータがソースコードで意図したような動作をします。 ただし、OSやCPUに対してコンパイルするため特定のOS、CPUでしか動きません。 次に、Java言語の場合について、同じように説明しましょう。 [ここでJava言語の図を書く] Java言語では、コンパイラによってコンパイルした後に中間言語(バイトコード)が生成され、その中間言語をJVM(JavaVirtualMachine)が機械語に翻訳して、 CPUへ命令をだして、結果ソフトウェアが実行される。 Java言語でのミソはこのJVMと中間言語です。 JVMはシステムのアーキテクチャごとに用意されていて、例えば、Windows用のJVMやLinux用のJVM、はたまた携帯電話のOS用のJVMなどもあります。 ソースコードのコンパイル後に生成される中間言語と、それぞれのJVMがあればソフトウェアが実行できます。 この二つを見比べた場合、C言語もLinux用などにコンパイルすれば実行することが可能です。しかしC言語はOS固有の機能を直接使うのでコンパイルのみでなくソースコードも変更する必要があります。 Java言語は一度コンパイルした後は、中間言語と、Windows用のJVMやLinux用のJVMを用意するだけで、どの環境(携帯電話の上でも動く)でも動かすことができる Javaはオブジェクト指向プログラミングであり現在の主流の考えでプログラミングすることができます。またメモリ管理や例外処理機構があるのでつまずきにくいと思います。 まとめ JVMが様々なOSごとに用意されていれば、中間言語とJVMでどんな環境でも動くので汎用性が高いプログラミング言語。 いままでプログラミングしたことない人にとっても、比較的取っつきやすい言語といえる。 簡単なイメージとしての図↓
https://w.atwiki.jp/naobe/pages/25.html
言語に戻る EJB JavaEE5 MBean JMX JNDI サーブレット 言語仕様 項目 説明 transient 修飾子。Seriariseオブジェクトの保管しないフィールドを修飾する。 クラスローダ http //www.techscore.com/tech/Java/JavaEE/Servlet/supplement-1/ 参照 目的 同じ名前でバージョンの異なるクラスを使用するために使う。クラスローダが異なればバージョンが異なっても良い。自分自身のクラスローダを得るにはgetClassLoader()メソッドを用いる。 クラスローダには親子関係があり、子クラスローダがクラスをロードするときには、親クラスローダにロードを依頼してロードできなければ、子クラスローダがロードする。 Class#getClassLoader()は、このクラスをロードしたクラスローダを返す クラスローダによってロードされたClassはパーマネント領域に格納される。ClassLoaderがGCされるとGCから解放される。 VMのクラスローダ ブートストラップクラスローダ JAVA_HOME /lib下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib下? 親はいない 拡張クラスローダ JAVA_HOME /lib/ext下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib/ext下?親はいない システムクラスローダ CLASSPATHで指定した位置からクラスをロードする。親は拡張クラスローダ。ブートストラップクラスローダは親子関係なしでも委譲されるということでは? 通常のnew Foo()ではこのクラスローダが使われる。 ブートストラップクラスローダ、拡張クラスローダ、システムクラスローダの順番でクラスをロードする。 コンテキストクラスローダ(JDK6 API Threadより) コンテキスト ClassLoader は、クラスおよびリソースをロードするときに、このスレッドで実行中のコードが使用するためにスレッドの作成側によって提供されます。コンテキスト ClassLoader が設定されていない場合、デフォルトでは親 Thread の ClassLoader コンテキストになります。通常、親スレッドのコンテキスト ClassLoader は、アプリケーションのロードに使用されるクラスローダーに設定されます。 なので、設定しなければシステムクラスローダがコンテキストクラスローダになる。 コンテキスト・クラスローダを設定・取得するには、java.lang.Thread#setContextClassLoader,getContextClassLoaderメソッドを使う。 クラスローダ作成 JDK6 APIより たとえば、アプリケーションはネットワーククラスローダーを作成して、サーバーからクラスファイルをダウンロードできます。コードは次のようになります。 ClassLoader loader = new NetworkClassLoader(host, port); Object main = loader.loadClass("Main", true).newInstance(); . . . ネットワーククラスローダーのサブクラスは、ネットワークからクラスをロードするために findClass メソッドと loadClassData メソッドを定義しなければなりません。クラスを作成するバイトを一度ダウンロードしたら、defineClass メソッドを使ってクラスインスタンスを生成する必要があります。実装の例を次に示します。 class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection . . . } } 特定のディレクトリからクラスをロードするクラスローダを作成してみる。 MyClassLoaderのmainメソッドで、test.MyClassLoaderTargetをロードしClassを作成する MyClassLoaderはClassLoaderを継承したクラスで、loadClassメソッドをオーバライドし、c /mydoc/tmp/を優先的にロードするディレクトリとしている。c /mydoc/tmp/にクラスがない場合は、ClassLoaderのloadClassメソッドを実行する ClassLoaderのloadClassメソッドでは、キャッシュにあれば、そのクラスを返す。なければ親クラスローダに移譲する。なければシステムクラスローダを使ってクラスをロードする Class#newInstance()を実行して、インスタンスを生成する MyClassLoaderTarget#execute()を実行し、MyClassLoaderTarget2をnewしてexecute()を実行する 実行結果を見ると、MyClassLoaderTarget2のクラスローダは、MyClassLoaderであることがわかる。つまりクラスローダを使ってロードしたクラスから別のクラスをnewするときはそのクラスローダを使うことがわかる。クラスローダを作成すると親クラスローダはシステムクラスローダになる。 コンテキストクラスローダは明示的に使用しない限り、使われることはなさそう。 package test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyClassLoader extends ClassLoader { private static final int BUFSIZE = 1024; private byte[] result; private int last = 0; @Override public Class ? loadClass(String name) throws ClassNotFoundException { Class ? c = null; try { c = findClass(name); } catch (ClassNotFoundException e) { c = super.loadClass(name); } return c; } private void dbg(String string) { System.out.println(string); } @Override protected Class ? findClass(String name) throws ClassNotFoundException { try { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } catch (Exception e) { throw new ClassNotFoundException(e.getMessage(), e); } } private byte[] loadClassData(String name) throws IOException { result = new byte[0]; last = 0; FileInputStream ins = null; try { byte[] buf = new byte[BUFSIZE]; int readSize = 0; name = name.replace( . , / ); File classFile = new File("c /mydoc/tmp/" + name + ".class"); ins = new FileInputStream(classFile); while((readSize = ins.read(buf)) != -1 ) { moveToResult(readSize, buf); } return result; } finally { if(ins != null) { ins.close(); } } } private void moveToResult(int readSize, byte[] buf) { byte[] tmp = new byte[last + readSize]; // 結果バイト配列をtmp配列の先頭にコピー System.arraycopy(result, 0, tmp, 0, result.length); // bufをtmp配列にコピー System.arraycopy(buf, 0, tmp, last, readSize); result = tmp; last += readSize; } public static void main(String[] args) { try { MyClassLoader loader = new MyClassLoader(); System.out.println("parent " + loader.getParent().getClass().getName()); Class ? clazz = loader.loadClass("test.MyClassLoaderTarget"); System.out.println("target class loader name " + clazz.getClassLoader().getClass().getName()); ((Executor)clazz.newInstance()).execute(); } catch (Exception e) { e.printStackTrace(); } } } package test; public class MyClassLoaderTarget implements Executor { @Override public void execute() { System.out.println("AAA"); MyClassLoaderTarget2 target2 = new MyClassLoaderTarget2(); target2.execute(); System.out.println("target2 class loader name " + target2.getClass().getClassLoader().getClass().getName()); } public static void main(String[] args) { MyClassLoaderTarget target = new MyClassLoaderTarget(); target.execute(); } } package test; public class MyClassLoaderTarget2 implements Executor { @Override public void execute() { System.out.println("BBB"); } public static void main(String[] args) { MyClassLoaderTarget2 target = new MyClassLoaderTarget2(); target.execute(); } } package test; public interface Executor { public void execute(); } 実行結果 parent sun.misc.Launcher$AppClassLoader target class loader name test.MyClassLoader AAA BBB target2 class loader name test.MyClassLoader ThreadLocal スレッドに固有のオブジェクトを保管するために使う(Thread Singleton)。Servletの中で、使用例としてDBに対するConnectionをスレッド毎に保管する場合があげられる。この場合、引数にConnectionを作成すると全てのメソッドにConnectionの引数が必要になり手間がかかる。スレッドにプライベートフィールドを作成して保管できないときに使える。 JDBC 参照 タイプ 説明 備考 type2 ベンダのライブラリと共同して、DBと通信。ベンダのクライアントアプリが必要。 type4 直接DBと通信。JDBCドライバサイズが大きい バッチ insert, updateが連続して行われるときにネットワークトラフィックを削減するために使う。PreparedStatementオブジェクトに対して、addBatch(), executeBatch()メソッドを使うと複数のステートメントをまとめてDBサーバ送信する。 言語コード コード名 説明 Windows-31J ShiftJISの拡張。NEC特殊コードもサポート。 スレッドダンプ 稼働中のスレッドを標準出力にダンプする。 kill -3 プロセス番号 出力例 daemon以外のスレッドを見る。以下の例ではSNMP APIで停止している。 Full thread dump Java HotSpot(TM) Server VM (11.2-b01 mixed mode) "RMI Scheduler(0)" daemon prio=10 tid=0x0955e000 nid=0x15db waiting on condition [0x30cd1000..0x30cd1fa0] java.lang.Thread.State TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for 0x37f243d8 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java 198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java 1963) at java.util.concurrent.DelayQueue.take(DelayQueue.java 164) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 583) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 576) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java 947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java 907) at java.lang.Thread.run(Thread.java 619) "Thread-7" prio=10 tid=0x0954bc00 nid=0x15bf in Object.wait() [0x30eb7000..0x30eb7ea0] java.lang.Thread.State TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.sleepUntilNotified(SnmpCallback.java 166) - locked 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.run(SnmpCallback.java 152) アノテーション 注釈。プログラムに影響を与えない。プログラムから読める。コンパイラの動作に影響を与える。 @Override Overrideアノテーションを付加したメソッドがオーバライドメソッドでなければコンパイルエラーになる。 @SuppressWarning Xlintを指定したときに発生する警告メッセージを抑制する。 アプレット jarファイルを指定するには、ARCHIVEタグを使う。CLASSPATHはきかない。 セキュリティポリシー java.policyファイルの構文 grant signedBy "signer_names", codeBase "URL", principal principal_class_name "principal_name", principal principal_class_name "principal_name", ... { permission permission_class_name "target_name", "action",signedBy "signer_names"; permission permission_class_name "target_name", "action",signedBy "signer_names"; ... }; ここで、"signer_names"、"URL"、principal_class_name、"principal_name"、permission_class_name、"target_name"、"action"、"signer_names"は、変数。 signedBy 、codeBase、、principal は省略可能。 意味は、signer_namesで署名されたURLにあるプログラムが、permission_class_nameで規定されるtarget_nameに対して、actionすることを許可する。target_name, actionについては、permission_class_nameのAPIを参照。 http //java.sun.com/j2se/1.5.0/ja/docs/ja/guide/security/PolicyFiles.html 参照。 例 permission java.io.FilePermission "\\\\192.168.1.40\\-", "read,write"; 192.168.1.40のリモートファイルに対する読み書きを許可する。 Linux firefoxへのJava Plugin インストール 例 # ln -s /usr/java/jdk1.6.0_20/jre/lib/i386/libnpjp2.so /opt/firefox/plugins インストールの確認 urlにabout pluginsを設定して開く Linuxでのplugin コントロールパネル 起動 $JAVA_HOME/bin/ControlPanel を実行 最大メモリ容量の修正 "-XX MaxPermSize=256m"をJavaタブのアプレットパラメータに追加 その他 スタックトレースをStringに変換する 仕事の都合で、最後の行で改行を削除してタブをスペースに変換している。 private String getStackTraceAsString(Exception e) { ByteArrayOutputStream ostream = new ByteArrayOutputStream(100); e.printStackTrace(new PrintStream(ostream)); String sep = System.getProperty("line.separator"); return ostream.toString().replaceAll(sep, "").replace("\t", " "); } 固定長レコードのファイルを出力 package test; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; public class SingleFille { private BufferedOutputStream bstream; /** * ファイルに書き込むデータ * 桁数 * 内容 */ private String[][] data = { {"aaa1", "bbb1", "ccc1"}, {"漢字2", "bbb2", "ccc2"}, {"aaa3", "漢字3", "ccc3"}, {"aaa4", "bbb4", "漢字4"}, }; /** 列の桁数 */ private int[] length = {10, 20, 30}; /** ファイルオフセット */ private int offset = 0; private static final String FILE_PATH = "singleFile.dat"; public static void main(String[] args) { SingleFille sfile = new SingleFille(); try { sfile.execute(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void execute() throws IOException { File file = new File(FILE_PATH); try { FileOutputStream stream = new FileOutputStream(file); bstream = new BufferedOutputStream(stream); for(int i = 0; i data.length; i++) { String[] line = data[i]; putFile(line); } } catch (IOException e) { throw e; } finally { if(bstream != null) { try { bstream.close(); } catch (IOException e) { throw e; } } } } /** * @param line * @throws IOException */ private void putFile(String[] line) throws IOException { for(int i = 0; i line.length; i++) { //各列を桁数になるように整形 byte[] term = createTerm(line[i], i); bstream.write(term); offset += term.length; } } /** * @param term * @param index * @return * @throws UnsupportedEncodingException */ private byte[] createTerm(String term, int index) throws UnsupportedEncodingException { //項目を格納するバイト byte[] outterm = new byte[length[index]]; //項目をShift_JISのバイトに変換 byte[] interm = term.getBytes("SJIS"); for(int i = 0; i outterm.length; i++) { if( i interm.length) { outterm[i] = interm[i]; } else { //残りはスペース outterm[i] = 0x20; } } return outterm; } }
https://w.atwiki.jp/cappu/pages/48.html
クライアント package com.javaagogo.postjavaobject.httpclient; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.HttpURLConnection; import java.net.URL; import com.javaagogo.postjavaobject.data.DataObject; public class Main { public static void main(String[] args) { try { URL url = new URL("http //localhost 8080/postjavaobject"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setDoInput(true); con.setDoOutput(true); DataObject data = new DataObject(); data.setName("I am client."); data.setId(1); // DataObjectを送信 ObjectOutputStream out = new ObjectOutputStream(con .getOutputStream()); out.writeObject(data); out.flush(); out.close(); ObjectInputStream in = new ObjectInputStream(con.getInputStream()); DataObject response = (DataObject) in.readObject(); in.close(); System.out.println("name=" + response.getName() + " id=" + response.getId()); } catch (Exception e) { e.printStackTrace(); } } } サーブレット package com.javaagogo.postjavaobject; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.javaagogo.postjavaobject.data.DataObject; @SuppressWarnings("serial") public class PostJavaObjectServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { try { // アプレットから要求を受信する ObjectInputStream in = new ObjectInputStream(req .getInputStream()); DataObject inData = (DataObject) in.readObject(); in.close(); // アプレットに返す文字列を作る DataObject outData = new DataObject(); outData.setName("サーブレット エコー " + inData.getName()); outData.setId(inData.getId()); // アプレットに送信する ObjectOutputStream out = new ObjectOutputStream(resp .getOutputStream()); out.writeObject(outData); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } データ package com.javaagogo.postjavaobject.data; import java.io.Serializable; public class DataObject implements Serializable{ /** * */ private static final long serialVersionUID = -6534725917724535071L; private int id ; public int getId() { return id; } public void setId(int id) { this.id = id; } public static long getSerialVersionUID() { return serialVersionUID; } public String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
https://w.atwiki.jp/kattsu/pages/27.html
参考サイト; http //blog.goo.ne.jp/glass-_-onion/e/6f86c9903ce7c75ebd5d56b827724961 http //www.hellohiro.com/customtag.htm 参考サイトをもとにリンクつけつつ、特定のアクションのみパンくずに表示するよう書いてみました 前提 strutsベース actionクラスは一度baseのアクションを作成し、必ず継承する。 (1)baseアクションに以下のように記述 //サブシステムで実装するクラス。 protected abstract String execute(ActionForm frm); public ActionForward execute(ActionMapping map, ActionForm frm, HttpServletRequest request, HttpServletResponse response) { String result = execute(frm); //パンくず処理開始 ActionStack stack = (ActionStack)request.getSession().getAttribute("ForwardStack"); //新規作成 if(stack == null) { stack = new ActionStack(); } //すでに登録済みかチェック int index = stack.search(request.getServletPath()); if(index == -1) { //-1=未登録 //新規push stack.push(request.getServletPath()); } else { //既登録 //登録してある箇所から後ろを除去 for(int i = 0; i index - 1; i++) { stack.pop(); } } //セッションに設定 request.getSession().setAttribute("ForwardStack", stack); return map.findForward(result); } (2)ActionStack.javaを作成 import java.util.Iterator; import java.util.Stack; public class ActionStack { Stack forwardStack = new Stack(); Stack forwardNmStack = new Stack(); //パンくず対象 private static final String[] targetActionArr = {"/topInit.do","/search.do","/detailInit.do"}; private static final String[] targetActionNmArr = {"トップ画面","検索画面 ","詳細画面"}; public String pop() { forwardNmStack.pop(); return (String)forwardStack.pop(); } public void push(String path) { String actiomcanPush = canPush(path); if(null != actiomcanPush){ forwardStack.push(path); forwardNmStack.push(actiomcanPush); } } public boolean empty() { return forwardNmStack.empty(); } public int search(String path) { int index = forwardStack.size(); for(Iterator i = forwardStack.iterator(); i.hasNext(); index--) { String forward = (String)i.next(); if(path.equals(forward)) { return index; } } return -1; } public Iterator iterator() { return forwardNmStack.iterator(); } public int size() { return forwardNmStack.size(); } private String canPush(String path){ int i = 0; for(String targetAction targetActionArr){ if(targetAction.equals(path)){ StringBuilder buf = new StringBuilder(); buf.append(" a href=\"."+path+"\" "); buf.append(targetActionNmArr[i]+" /a "); return buf.toString(); } i++; } return null; } } (3)TopicPathTag.javaを作成 import java.io.IOException; import java.util.Iterator; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import org.apache.struts.taglib.TagUtils; //ActionStackもインポート @SuppressWarnings("serial") public class TopicPathTag extends TagSupport { public int doStartTag() throws JspException { ActionStack stack = (ActionStack)TagUtils.getInstance().lookup( pageContext, "ForwardStack", "session"); StringBuilder buf = new StringBuilder(); for(Iterator i = stack.iterator(); i.hasNext();) { String forward = (String)i.next(); buf.append(forward); buf.append(" "); } buf.deleteCharAt(buf.lastIndexOf(" ")); try { JspWriter out = pageContext.getOut(); out.print(buf); } catch (IOException e) { throw new JspException(e); } return SKIP_BODY; } } (4)TLDファィルを作成(ファィル名は任意) ?xml version="1.0" encoding="Shift_JIS" ? !DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http //java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd" taglib tlibversion 1.0 /tlibversion jspversion 1.1 /jspversion shortname org /shortname tag name TopicPath /name !-タグクラスを指定-- tagclass jp.co.sample.TopicPathTag /tagclass bodycontent empty /bodycontent info パンくず /info /tag /taglib